package pck_tramitedocu.pck_src.pck_utiles;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import pck_tramitedocu.pck_src.pck_pojos.Cls_Posibilidad;
import pck_tramitedocu.pck_src.pck_pojos.Cls_Trabajador;
import pck_tramitedocu.pck_src.pck_pojos.Cls_Unidad_Organizativa;

public class Cls_InvocaWebService {

    public static ArrayList<Cls_Trabajador> obtieneUsuarioAreaRRHHWs(Map<String, String> map) {
        ArrayList array_usuario = new ArrayList();
        String url = "RRHH-Servicios/resources/Trabajador/2/" + (String) map.get(Cls_Parametros.Map_DNI) + "-" + (String) map.get(Cls_Parametros.Request_DATO_A_BUSCAR) + "-" + (String) map.get(Cls_Parametros.Request_PAGINA) + "-" + (String) map.get("rp");
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        Document documento = gestionaWebService(url);
        Node nodoRaiz = documento.getFirstChild();
        NodeList listaNodosHijo = nodoRaiz.getChildNodes();
        for (int i = 0; i < listaNodosHijo.getLength(); i++) {
            Node unNodo = listaNodosHijo.item(i);
            NodeList ndo_usuario = unNodo.getChildNodes();
            String id = ndo_usuario.item(3).getFirstChild().getNodeValue();
            array_usuario.add(new Cls_Trabajador(ndo_usuario.item(2).getFirstChild().getNodeValue(), ndo_usuario.item(4).getFirstChild().getNodeValue(), ndo_usuario.item(1).getFirstChild().getNodeValue(), ndo_usuario.item(0).getFirstChild().getNodeValue(), ndo_usuario.item(5).getFirstChild().getNodeValue(), ndo_usuario.item(3).getFirstChild().getNodeValue(), "", "0"));
        }

        return array_usuario;
    }

    public static ArrayList<Cls_Trabajador> obtieneUsuariosRRHHWs(Map<String, String> map) {
        ArrayList array_usuario = new ArrayList();
        String url = "RRHH-Servicios/resources/Trabajador/5/" + (String) map.get(Cls_Parametros.Request_DATO_A_BUSCAR) + "-" + (String) map.get(Cls_Parametros.Request_PAGINA) + "-" + (String) map.get("rp") + "-vacaiones";
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        Document documento = gestionaWebService(url);
        Node nodoRaiz = documento.getFirstChild();
        NodeList listaNodosHijo = nodoRaiz.getChildNodes();
        for (int i = 0; i < listaNodosHijo.getLength(); i++) {
            Node unNodo = listaNodosHijo.item(i);
            NodeList ndo_usuario = unNodo.getChildNodes();
            array_usuario.add(new Cls_Trabajador(ndo_usuario.item(2).getFirstChild().getNodeValue(), ndo_usuario.item(5).getFirstChild().getNodeValue(), ndo_usuario.item(1).getFirstChild().getNodeValue(), ndo_usuario.item(0).getFirstChild().getNodeValue(), ndo_usuario.item(6).getFirstChild().getNodeValue(), ndo_usuario.item(3).getFirstChild().getNodeValue(), ndo_usuario.item(7).getFirstChild().getNodeValue(), ndo_usuario.item(4).getFirstChild().getNodeValue()));
        }
        return array_usuario;
    }

    public static ArrayList<Cls_Trabajador> obtieneTrabajadorCargosRRHHWs(Map<String, String> map) {
        ArrayList array_usuario = new ArrayList();
        String url = "RRHH-Servicios/resources/Trabajador/12/" + (String) map.get(Cls_Parametros.Request_DATO_A_BUSCAR);
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        Document documento = gestionaWebService(url);
        Node nodoRaiz = documento.getFirstChild();
        NodeList listaNodosHijo = nodoRaiz.getChildNodes();
        for (int i = 0; i < listaNodosHijo.getLength(); i++) {
            Node unNodo = listaNodosHijo.item(i);
            NodeList ndo_usuario = unNodo.getChildNodes();
            array_usuario.add(new Cls_Trabajador(ndo_usuario.item(2).getFirstChild().getNodeValue(), ndo_usuario.item(5).getFirstChild().getNodeValue(), ndo_usuario.item(1).getFirstChild().getNodeValue(), ndo_usuario.item(0).getFirstChild().getNodeValue(), ndo_usuario.item(6).getFirstChild().getNodeValue(), ndo_usuario.item(3).getFirstChild().getNodeValue(), ndo_usuario.item(7).getFirstChild().getNodeValue(), ndo_usuario.item(4).getFirstChild().getNodeValue()));
        }
        return array_usuario;
    }

    public static ArrayList<Cls_Trabajador> validarLoginRRHHWs(Map<String, Object> map) {
        ArrayList<Cls_Trabajador> array_usuarios = new ArrayList<Cls_Trabajador>();
        String url = "RRHH-Servicios/resources/Trabajador/1/" + (String) map.get(Cls_Parametros.Map_DNI);
        Document documento = gestionaWebService(url);
        if (documento == null) {
            return null;
        }
        try {
            Node nodoRaiz = documento.getFirstChild();
            NodeList listaNodosHijo = nodoRaiz.getChildNodes();
            for (int i = 0; i < listaNodosHijo.getLength(); i++) {
                NodeList ndo_usuario = listaNodosHijo.item(i).getChildNodes();
                Cls_Trabajador usuario = new Cls_Trabajador();
                usuario.setArea(ndo_usuario.item(0).getFirstChild().getNodeValue());
                usuario.setCargo(ndo_usuario.item(1).getFirstChild().getNodeValue());
                usuario.setCodigo(ndo_usuario.item(2).getFirstChild().getNodeValue());
                usuario.setCodigo_area(ndo_usuario.item(3).getFirstChild().getNodeValue());
                usuario.setCod_area_pertenece(ndo_usuario.item(4).getFirstChild().getNodeValue());
                usuario.setCod_directiva_pertenece(ndo_usuario.item(5).getFirstChild().getNodeValue());
                usuario.setCodigo_visto_bueno(ndo_usuario.item(6).getFirstChild().getNodeValue());
                usuario.setCorreo(ndo_usuario.item(7).getFirstChild().getNodeValue());
                usuario.setDni_jefe(ndo_usuario.item(8).getFirstChild().getNodeValue());
                usuario.setEsta_vacaciones(Boolean.parseBoolean(ndo_usuario.item(9).getFirstChild().getNodeValue()));
                usuario.setNombres(ndo_usuario.item(10).getFirstChild().getNodeValue());
                usuario.setProfesion(ndo_usuario.item(11).getFirstChild().getNodeValue());
                usuario.setTipo_usuario_area(Integer.parseInt(ndo_usuario.item(12).getFirstChild().getNodeValue()));
                array_usuarios.add(usuario);
            }
        } catch (Exception ex) {
            Logger.getLogger(Cls_InvocaWebService.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
        return array_usuarios;
    }

    public static int obtenerCantidadTrabajadoresRRHHWs(Map<String, String> map) {
        String url = "RRHH-Servicios/resources/Trabajador/3/" + (String) map.get(Cls_Parametros.Request_DATO_A_BUSCAR) + "-.";
        Document documento = gestionaWebService(url);
        Node nodoRaiz = documento.getFirstChild();
        NodeList listaNodosHijo = nodoRaiz.getChildNodes();
        return new Integer(listaNodosHijo.item(0).getFirstChild().getNodeValue()).intValue();
    }

    public static int obtenerCantidadTrabajadoresAreaRRHHWs(Map<String, String> map) {
        String url = "RRHH-Servicios/resources/Trabajador/4/" + (String) map.get(Cls_Parametros.Request_DATO_A_BUSCAR) + "-" + (String) map.get(Cls_Parametros.Map_DNI);
        Document documento = gestionaWebService(url);
        Node nodoRaiz = documento.getFirstChild();
        NodeList listaNodosHijo = nodoRaiz.getChildNodes();
        return new Integer(listaNodosHijo.item(0).getFirstChild().getNodeValue()).intValue();
    }

    public static ArrayList<Cls_Trabajador> obtenerCorreoTrabajadoresRRHHWs(Map<String, String> map) {
        ArrayList array_usuario = new ArrayList();
        String url = "RRHH-Servicios/resources/Trabajador/6/" + (String) map.get(Cls_Parametros.Request_DATO_A_BUSCAR) + "-" + (String) map.get(Cls_Parametros.Request_PAGINA) + "-" + (String) map.get("rp");
        Document documento = gestionaWebService(url);
        Node nodoRaiz = documento.getFirstChild();
        NodeList listaNodosHijo = nodoRaiz.getChildNodes();
        for (int i = 0; i < listaNodosHijo.getLength(); i++) {
            Node unNodo = listaNodosHijo.item(i);
            NodeList ndo_usuario = unNodo.getChildNodes();
            array_usuario.add(new Cls_Trabajador(ndo_usuario.item(0).getFirstChild().getNodeValue(), ndo_usuario.item(2).getFirstChild().getNodeValue(), ndo_usuario.item(1).getFirstChild().getNodeValue()));
        }
        return array_usuario;
    }

    public static int obtenerCantidadCorreosTrabajadoresRRHHWs(Map<String, String> map) {
        String url = "RRHH-Servicios/resources/Trabajador/7/" + (String) map.get(Cls_Parametros.Request_DATO_A_BUSCAR) + "-.";
        Document documento = gestionaWebService(url);
        Node nodoRaiz = documento.getFirstChild();
        NodeList listaNodosHijo = nodoRaiz.getChildNodes();
        return new Integer(listaNodosHijo.item(0).getFirstChild().getNodeValue()).intValue();
    }

    public static ArrayList<Cls_Unidad_Organizativa> obtenerUnidadesOrganicas(Map<String, String> map) {
        String url = "RRHH-Servicios/resources/UnidadOrganica/2/" + (String) map.get(Cls_Parametros.Request_DATO_A_BUSCAR) + "-" + (String) map.get(Cls_Parametros.Request_PAGINA) + "-" + (String) map.get("rp");

        ArrayList array_unidades = new ArrayList();

//        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        Document documento = gestionaWebService(url);
        Node nodoRaiz = documento.getFirstChild();
        NodeList listaNodosHijo = nodoRaiz.getChildNodes();
        for (int i = 0; i < listaNodosHijo.getLength(); i++) {
            Node unNodo = listaNodosHijo.item(i);
            NodeList ndo_usuario = unNodo.getChildNodes();
            array_unidades.add(new Cls_Unidad_Organizativa(ndo_usuario.item(7).getFirstChild().getNodeValue(), ndo_usuario.item(2).getFirstChild().getNodeValue(), ndo_usuario.item(0).getFirstChild().getNodeValue(), ndo_usuario.item(4).getFirstChild().getNodeValue(), ndo_usuario.item(5).getFirstChild().getNodeValue(), ndo_usuario.item(6).getFirstChild().getNodeValue(), ndo_usuario.item(8).getFirstChild().getNodeValue(), ndo_usuario.item(1).getFirstChild().getNodeValue(), ndo_usuario.item(3).getFirstChild().getNodeValue()));
        }
        return array_unidades;
    }

    public static int obtenerCantidadUnidadesRRHHWs(Map<String, String> map) {
        String url = "RRHH-Servicios/resources/UnidadOrganica/1/" + (String) map.get(Cls_Parametros.Request_DATO_A_BUSCAR) + "-.";
        Document documento = gestionaWebService(url);
        Node nodoRaiz = documento.getFirstChild();
        NodeList listaNodosHijo = nodoRaiz.getChildNodes();
        return new Integer(listaNodosHijo.item(0).getFirstChild().getNodeValue()).intValue();
    }

    public static ArrayList<Cls_Posibilidad> obtenerPosibilidadEnvioRRHHWs(Map<String, Object> map) {
        String url = "RRHH-Servicios/resources/UnidadOrganica/8/" + (String) map.get(Cls_Parametros.Map_CODIGO_UNIDAD_ORGANIZATIVA);
        System.out.println("-----------------------");
        System.out.println("Url: " + url);
        System.out.println("-----------------------");
        ArrayList<Cls_Posibilidad> envio = new ArrayList();
        Cls_Posibilidad itemPos;
        Document documento = gestionaWebService(url);
        Node nodoRaiz = documento.getFirstChild();
        NodeList listaNodosHijo = nodoRaiz.getChildNodes();
        for (int i = 0; i < listaNodosHijo.getLength(); i++) {
            itemPos = new Cls_Posibilidad();
            Node item = listaNodosHijo.item(i);
            NodeList nodoPos = item.getChildNodes();
            itemPos.setCodUniOrganizativa((String) map.get(Cls_Parametros.Map_CODIGO_UNIDAD_ORGANIZATIVA));
            itemPos.setTipoDocumento(nodoPos.item(3).getFirstChild().getNodeValue());
            itemPos.setAscendente(Boolean.valueOf(nodoPos.item(0).getFirstChild().getNodeValue()));
            itemPos.setDescendente(Boolean.valueOf(nodoPos.item(1).getFirstChild().getNodeValue()));
            itemPos.setMismoNivel(Boolean.valueOf(nodoPos.item(1).getFirstChild().getNodeValue()));
            envio.add(itemPos);
        }
        itemPos = null;
        System.gc();
        return envio;
    }

    public static ArrayList<Cls_Posibilidad> obtenerPosibilidadProyeccionRRHHWs(Map<String, Object> map) {
        String url = "RRHH-Servicios/resources/UnidadOrganica/9/" + (String) map.get(Cls_Parametros.Map_CODIGO_UNIDAD_ORGANIZATIVA);
        ArrayList<Cls_Posibilidad> proyeccion = new ArrayList();
        Cls_Posibilidad itemPos;
        Document documento = gestionaWebService(url);
        Node nodoRaiz = documento.getFirstChild();
        NodeList listaNodosHijo = nodoRaiz.getChildNodes();
        for (int i = 0; i < listaNodosHijo.getLength(); i++) {
            itemPos = new Cls_Posibilidad();
            Node item = listaNodosHijo.item(i);
            NodeList nodoPos = item.getChildNodes();
            itemPos.setCodUniOrganizativa((String) map.get(Cls_Parametros.Map_CODIGO_UNIDAD_ORGANIZATIVA));
            itemPos.setTipoDocumento(nodoPos.item(3).getFirstChild().getNodeValue());
            itemPos.setAscendente(Boolean.valueOf(nodoPos.item(0).getFirstChild().getNodeValue()));
            itemPos.setDescendente(Boolean.valueOf(nodoPos.item(1).getFirstChild().getNodeValue()));
            itemPos.setMismoNivel(Boolean.valueOf(nodoPos.item(2).getFirstChild().getNodeValue()));
            proyeccion.add(itemPos);
        }
        itemPos = null;
        System.gc();
        return proyeccion;
    }

    public static ArrayList<Cls_Posibilidad> obtenerPosibilidadVistoBuenoRRHHWs(Map<String, Object> map) {
        String url = "RRHH-Servicios/resources/UnidadOrganica/10/" + (String) map.get(Cls_Parametros.Map_CODIGO_UNIDAD_ORGANIZATIVA);
        ArrayList<Cls_Posibilidad> vistoBueno = new ArrayList();
        Cls_Posibilidad itemPos;
        Document documento = gestionaWebService(url);
        Node nodoRaiz = documento.getFirstChild();
        NodeList listaNodosHijo = nodoRaiz.getChildNodes();
        for (int i = 0; i < listaNodosHijo.getLength(); i++) {
            itemPos = new Cls_Posibilidad();
            Node item = listaNodosHijo.item(i);
            NodeList nodoPos = item.getChildNodes();
            itemPos.setCodUniOrganizativa((String) map.get(Cls_Parametros.Map_CODIGO_UNIDAD_ORGANIZATIVA));
            itemPos.setTipoDocumento(nodoPos.item(3).getFirstChild().getNodeValue());
            itemPos.setAscendente(Boolean.valueOf(nodoPos.item(0).getFirstChild().getNodeValue()));
            itemPos.setDescendente(Boolean.valueOf(nodoPos.item(1).getFirstChild().getNodeValue()));
            itemPos.setMismoNivel(Boolean.valueOf(nodoPos.item(2).getFirstChild().getNodeValue()));
            vistoBueno.add(itemPos);
        }
        itemPos = null;
        System.gc();
        return vistoBueno;
    }

    private static Document gestionaWebService(String url) {
        int cont = 0;
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        Document documento = null;
        String url_send = "";
        do {
            try {
                DocumentBuilder builder = factory.newDocumentBuilder();
                url_send = Cls_Parametros.IP_WEBSERVICE + Cls_Parametros.PORT_WEBSERVICE + url;
                Logger.getLogger(Cls_InvocaWebService.class.getName()).log(Level.SEVERE, "URL: " + url_send);
                documento = builder.parse(url_send);
                return documento;
            } catch (java.net.ConnectException ex) {
                Logger.getLogger(Cls_InvocaWebService.class.getName()).log(Level.SEVERE, null, ex);
            } catch (java.io.FileNotFoundException ex) {
                Logger.getLogger(Cls_InvocaWebService.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ParserConfigurationException ex) {
                Logger.getLogger(Cls_InvocaWebService.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SAXException ex) {
                Logger.getLogger(Cls_InvocaWebService.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(Cls_InvocaWebService.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NullPointerException ex) {
                Logger.getLogger(Cls_InvocaWebService.class.getName()).log(Level.SEVERE, null, ex);
            }
            cont++;
        } while (cont<3);
        return null;
    }
}
